\documentclass{report}

% Ici, et jusqu'au \begin{document} ci-dessous, c'est le preambule : on y met
% les declarations de style, les definitions de macros, etc.

%%%% Personnalisation du style defaut

% Fichiers de style utilises ; les declarations se font au moyen de la commande
% \usepackage

\usepackage[french]{babel} % Pour adopter les r?gles de typographie fran?aise

\usepackage[utf8x]{inputenc}

\usepackage{graphicx}

\usepackage{amsmath} % Les biblioth?ques LaTeX de l'American
                     % Mathematical Society sont pleines de macros
                     % int?ressantes (voire indispensables).

\usepackage{fancyvrb}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{rotating}
\usepackage{pdflscape}

%%configuration de listings
\lstset{
language=ada,
basicstyle=\ttfamily\small, %
identifierstyle=\bf\color{black}, %
keywordstyle=\color{red}, %
stringstyle=\color{blue!60}, %
commentstyle=\it\color{blue}, %
columns=flexible, %
tabsize=2, %
extendedchars=true, %
showspaces=false, %
showstringspaces=false, %
numbers=left, %
numberstyle=\tiny, %
breaklines=true, %
breakautoindent=true, %
captionpos=b
}

\definecolor{Zgris}{rgb}{0.87,0.85,0.85}

\newsavebox{\BBbox}
\newenvironment{DDbox}[1]{
\begin{lrbox}{\BBbox}\begin{minipage}{\linewidth}}
{\end{minipage}\end{lrbox}\noindent\colorbox{Zgris}{\usebox{\BBbox}} \\
[.5cm]}

%%%% D?claration d'environnements

% Les d?finitions, th?or?mes et autres lemmes, corollaires, propositions,
% exemples, se d?clarent au moyen de \newtheorem

\newtheorem{de}{D?finition}[subsection] % les d?finitions et les th?or?mes sont
\newtheorem{theo}{Th?or?me}[section]    % num?rot?s par section
\newtheorem{prop}[theo]{Proposition}    % Les propositions ont le m?me compteur
                                        % que les th?or?mes

%%%% Notations

% Ici l'on d?finit les notations que l'on utilisera, au moyen de la macro
% \newcommand

\newcommand{\ordmult}{\mathop{.}} % \ordmult est l'op?rateur de multiplication
                                  % d'ordinaux

% Voici une notation qui prend des param?tres

\newcommand{\expo}[2]{#1^{#2}}

%%%% d?clarations pour le titre

\author{Kevin Dorfer, Jonathan Dorival, Jonathan Michaux, \\
        Bernard Pratz, Menjato Rakototsimba, Fabrice Troïlo}

\title{IBDR\\
Rapport Final}

\date{\today}

%%%% fin du pr?ambule, on passe au contenu : tout le texte entre
%%%% \begin{document} et \end{document}

\begin{document}

\maketitle

\tableofcontents

\chapter*{Introduction}

 % Intro du rapport
 %% (a faire a la fin en même temps que la conclusion)
    Ce projet, situé dans le cadre du Master 2 SAR de l'UPMC, fait parti de l'enseignement 
d'\textit{Ingénierie des Bases de Données Réparties} qui nous divise en groupes de travail. 
Ce rapport a été écrit par les 6 étudiants du groupe \textit{ACID} et documente la réalisation
d'une base de données dans le contexte d'une entreprise de gestion locative de supports vidéos.\\

L'objectif principal, en dehors du fait de nous mettre à l'aise avec un environnement windows 
(\textit{SQL~Server}) et un langage spécifique (\textit{Transact~SQL}) pour élargir nos 
connaissances, est de se former à monter toutes les étapes d'un projet d'ingénierie des 
bases de données, avec un rendez-vous hebdomadaire avec M.~Cheminaud. Les membres du groupe
n'avaient pas une connaissance homogène des bases de données, certains n'ayant presque pas
vu les bases de données au cours de leurs études, d'autres n'ayant juste jamais expérimenté les 
aspects de répartition.\\

Ce document présente une modélisation de base de données selon la méthode \textit{Merise}, ainsi 
vous y trouverez un dictionnaire de données, un diagramme Modèle Entité-Associations avec un dictionnaire
des Associations et le Schéma Relationnel résultant du MEA.\\
S'en suit une explication de notre méthode de travail et du déploiement, pour finir par le détail
de l'implémentation des fonctionnalités attendues pour répondre aux charges du projet.\\


\chapter{Analyse et conception de la base de donnée}

 % après négociation avec M.Cheminaud, interprétation choisie de la db
 % rappeler ce qui est demandé (copier/collé du document qu'il nous a envoyé)
Ce chapitre résume tout notre travail d'analyse et de conception, étape par étape, 
en essayant de suivre au maximum l'ordre qui a été demandé et réalisé par les étudiants.
Pour commencer, le dictionnaire des données ci-dessous reprend les éléments des
charges, définissant le type et le domaine de chacune des données. Ensuite, il y a
un schéma Modèle-Entité-Associations mettant en exergue les associations entre entités
et donnant une vue générale des données définies dans le dictionnaire des données.\\
 \\
Le dictionnaire et le MEA nous permettent d'avoir un document de base pour étudier les
aspects fonctionnels sans entrer dans le détail du Schéma Relationnel et a servi de
«contrat» entre la maîtrise d'ouvrage et l'équipe.

\section{Dictionnaire des données}

  % tableau des données en VF uniquement

\begin{table}
\footnotesize
\begin{tabular}{|l|l|l|r|p{5cm}|}
\hline
    Nom MEA             &  Description                          &  Type     &  Longueur  &  Valeur (contraintes) \\
\hline
\hline
   Film                 &                                       &           &            &                       \\
\hline
    isan                &  Numéro ISAN                          &  String   & 64         &  non nul, ex : ISAN 0000-0001-8947-0000-8-0000-0000-D \\
    titre               &  Titre film                           &  String   & 20         &  non nul              \\
    date\_sortie         &  Date de sortie                       &  Date     & 10         &  non nul, valeur < date actuelle \\
    affichable          &  Affichable                           &  Boolean  & 1          &  {0,1}                \\
\hline
   Personne             &                                       &           &            &  \\
\hline
    nom\_pers            &  Nom personne                         &  String   & 64         &  non nul \\
    prénom\_pers         &  Prénom personne                      &  String   & 64         &  non nul \\
    date\_nais\_pers      &  Date de naissance                    &  Date     & 10         &  non nul, valeur < date actuelle \\
    nationalité         &  Nationalité                          &  String   & 64         &  non nul, {valeur parmi les nationalités possibles} \\
\hline
   Edition              &                                       &           &            &  \\
\hline
    id\_edit             &  Identificateur                       &  Entier   & 20         &  non nul \\
    support             &  Support                              &  String   & 64         &  non nul, {vhs,dvd,blue-ray} \\
    date\_edit           &  Date d'édition                       &  Date     & 10         &  non nul, valeur < date actuelle \\
    extras              &  Autres Infos.                        &  String   & 256        &  none \\
\hline
   Exemplaire           &                                       &           &            &  \\
\hline
    id\_exemplaire       &  Identificateur de l'exemplaire       &  Entier   & 20         &  non nul \\
    reservé             &  Est réservé                          &  booléen  & 1          &  défaut = false \\
    loué                &  Est loué                             &  booléen  & 1          &  défaut = false \\
\hline
   Langue               &                                       &           &            &  \\
\hline
    langue              &  Langue                               &  String   & 64         &  non nul, {valeur parmi liste de langues possibles} \\
\hline
   Distinction          &                                       &           &            &  \\
\hline
    intitule            &  Intitulé                             &  String   & 256        &  non nul, {oscar du meilleur film, oscar du meilleur acteur, ...} \\
    date\_remise         &  Date de remise                       &  Entier   & 4          &  non nul, valeur <= date actuelle \\
\hline
   Genre                &                                       &           &            &  \\
\hline
    intitulé\_genre      &  Nom du genre                         &  String   &            &  non nul, {valeur parmi la liste de genres possibles} \\
\hline
   Relance              &                                       &           &            &  \\
\hline
    num\_relance         &  Numéro relance                       &  Entier   & 20         &  non nul \\
    niveau              &  Niveau de la relance                 &  String   &            &  non nul, {1,2,3} \\
   date                 & Heure de la relance                   & HeureDate &            &  \\
\hline
   Location             &                                       &           &            &  \\
\hline
    id\_loc              &  Identificateur                       &  Entier   & 20         &  non nul \\
    date\_loc            &  Date de location                     & HeureDate & 16         &  non nul, valeur <= date actuelle ex:16:38 13/11/2009 \\
    remise\_prévue       &  Remise prévue                        & HeureDate & 16         &  valeur > date\_loc \\
    remise\_effective    &  Remise effective                     & HeureDate & 16         &  valeur > date\_loc \\
\hline
   Réservation          &                                       &           &            &  \\
\hline
    id\_res              &  Identificateur                       &  Entier   & 20         &  non nul \\
    date                &  Date réservation                     &  HeureDate& 16         &  non nul \\
    date\_expir          &  Date d'expiration                    &  HeureDate& 16         &  valeur > date \\
\hline
   Abonnement           &                                       &           &            &  \\
\hline
    id\_abo              &  Identificateur                       &  Entier   & 20         &  non nul \\
    solde               &  Solde du compte                      &  Entier   & 20         &  valeur >= 0 \\
    début               &  Date début                           &  HeureDate& 16         &   non nul \\
    butoir              &  Date butoir                          &  HeureDate& 16         &  non nul, valeur > début \\
\hline
   Abonné               &                                       &           &            &  \\
\hline
    nom\_ab              &  Nom abonné                           &  String   & 64         &  non nul \\
    prenom\_ab           &  Prénom abonné                        &  String   & 64         &  non nul \\
    teléphone           &  Numéro de téléphone                  &  String   & 16         &  non nul \\
    date\_naissance\_ab   &  Date de naissance                    &  Date     & 10         &  non nul, valeur < date actuelle \\
    numéro\_voie         &  N° de voie                           &  String   & 8          &  non nul, caractères numériques \\
    type\_voie           &  Intitulé de la voie                  &  String   & 16         &  {rue,chemin,boulevard,faubourg,boulevard,place} \\
    libellé\_voie        &  Libellé de la voie                   &  String   & 128        &  non nul \\
    complement\_adr      &  Complément d'adresse                 &  String   & 16         &  none \\
    ville               &  Ville                                &  String   & 128        &  non nul, {valeur parmi les villes existantes} \\
    code\_postal         &  Code postal                          &  Entier   & 5          &  non nul \\
    pays                &  Pays                                 &  String   & 128        &  non nul, {valeur parmi les pays existants} \\
    liste\_noire         &  Client blacklisté ou pas             &  Boolean  & 1          &  défaut = 0 \\
\hline
   Type\_Abo             &                                       &           &            &  \\
\hline
    type                &  Type d'abonnement                    &  String   & 64         &  non nul, {bronze,argent,or} \\
\hline
\end{tabular}
\caption{Dictionnaire des données}
\end{table}

  % explication des champs et des choix d'implémentation

\subsection*{Choix de conception}

\paragraph{Clefs non-calculées} Pour les entités correspondant à des personnes, nous avons choisi de faire des clefs sur
nom, prénom pour les participants aux films et avec les dates de naissances pour les abonnés. Pour les entités de description,
telles que les genre ou distinctions d'un film, ou encore les langues de sous-titre ou de doublage d'un film et le type d'un
abonnement, nous avons utilisé un intitulé simple en chaîne de caractères.

\paragraph{Clefs calculées} Pour les éditions, les exemplaires, les réservations, les locations et les abonnements, nous
utilisons des clefs calculées pour garantir l'unicité des données entrées. En effet, pour les éditions, bien toute la table
puisse \^etre considérée pour garantir l'unicité de ses tuples, comme de nombreuses transactions porteront sur cette table
(pour les réservations, les locations, les retours de location, les ajouts...), nous avons opté pour cette solution plus
pratique qui simplifie les jointures. Pour toutes les autres entités, l'unicité ne peut \^etre garantie autrement qu'avec
une clef calculée, chacune de ces entités n'ayant aucun élément réellement discriminants (en dehors des horodates). De plus,
comme il est demandé d'avoir une traçabilité des transactions effectuées par les clients, les locations et réservations
effectués par les abonnements sont gardés en mémoire, m\^eme une fois terminées. Il en est de m\^eme pour les relances.

\paragraph{Film} Nous avons préféré utiliser le code ISAN défini pour identifier les films (ainsi que les éditions,
mais nous nous contenterons dans le cadre de cette réalisation de ne l'utiliser que pour les différents films), plutôt
que de se baser sur les noms de films et dates de sorties et autres éléments discriminants.

\paragraph{Abonné} Afin de faciliter les recherches géolocalisés pouvant intervenir ultérieurement dans la vie de la base,
nous avons normalisé les coordonnées de l'abonné au plus fin.

\section{Modèle entité-association}

Le MEA se trouve en figure~\ref{MEA}.

  % figure MEA
\begin{figure}[!p]
  \begin{center}
     \includegraphics[width=0.8\textwidth]{Schema_MEA.png}
  \end{center}
  \label{MEA}
  \caption{Schéma Modèle Entité Associations}
\end{figure}

  % listing et explication des relations

\begin{table}[!p]
\begin{tabular}{|l|l|r|l|r|p{3cm}|}
\hline
  Association       & Table 1        & Card 1        & Table 2          & Card 2        & Description \\
\hline
  A joué dans       & Personne       & 0,n           & Film             & 1,n           & porteuse de rôle (domaine: acteur;réalisateur;producteur) \\
\hline
  Appartient à      & Genre          & 0,n           & Film             & 1,n           & \\
\hline
  A reçu            & Distinction    & 0,n           & Film             & 1,1           & \\
\hline
  existe en         & Film           & 1,1           & Edition          & 1,n           & \\
\hline
  a pour langue     & Langue         & 0,n           & Edition          & 1,n           & porteuse de type (domaine: sous-titre;doublage;version originale)\\
\hline
  est attribué pour & Réservation    & 0,1           & Edition          & 1,1           & \\
\hline
  est disponible en & Exemplaire     & 1,n           & Edition          & 1,1           & \\
\hline
  est loué en       & Exemplaire     & 1,1           & Location         & 0,1           & \\
\hline
  a effectué        & Abonnement     & 0,n           & Location         & 0,1           & \\
\hline
  a placé en        & Abonnement     & 0,1           & Réservation      & 0,n           & \\
\hline
  a été envoyée pour& Relance        & 0,n           & Location         & 1,1           & \\
\hline
  possède           & Abonné         & 1,1           & Abonnement       & 0,n           & \\
\hline
  est de type       & Abonnement     & 0,n           & TypeAbonnement   & 1,1           & \\
\hline
\end{tabular}
\caption{Relations du MEA}
\end{table}

  % explications des choix d'implémentation
\subsection*{Choix de conception}

\paragraph{Relations avec porteuses} Comme on peut le constater dans le schéma {\it MEA} en figure \ref{MEA},
nous avons deux relations avec porteuses : «Personne ayant joué un rôle dans Film» et «Edition ayant pour
langue Langue selon type». Afin d'éviter une multiplicité de relations entre Edition et langue et entre Film
et Personne, nous avons préféré utilisé des relations n-aires avec porteuses. Ainsi, «rôle» contient ce qu'une
personne a réalisé dans un film et «type» le type de traduction pour une édition.

\paragraph{Films, Editions, Exemplaires} Selon la logique de conception d'une base de donnée, les entités de descriptions
d'une entité (telles que Personne, Genre, Distinction pour Film) sont en relation n-n ou 1-n avec cette entité.
Ensuite, une hiérarchie peut ressortir sur les films tel que : Exemplaire -> Edition -> Film, par une chaîne de
relations 1-n.

\paragraph{Réservations, locations} Le lien entre l'abonnement et les films se fait par des relations 0-1
(loué/réservé ou non) sur les entités réservation et location, l'abonnement ayant de 0 à n réservations
ou locations. Les réservations portent sur des éditions, de façon à ce qu'une procédure stockée puisse
garantir l'existence d'un exemplaire quelqu'il soit en stock pendant la période réservée. Une location
porte sur un exemplaire, représentant le fait qu'un exemplaire est physiquement sorti du stock pendant
la durée de la location.

\paragraph{Abonnements, Compte} Il était suggéré par le cahier des charges de séparer le solde d'un
abonnement de celui-ci, sûrement à des fins de traçabilité. Toutefois, comme la mise en place d'un
entrepôt de données est hors du cadre de cette réalisation, nous avons préférer simplifier la base
en unifiant abonnements et compte (qui étaient initialement liés par une relation 1-1) dans l'entité
Abonnement.

\paragraph{Abonné, Abonnement} Un abonné, personne physique qui paye et est facturé des transactions
sur la base, peut possèder plusieurs abonnements (qui, bien qu'anonymes, peuvent correspondre à une
ou plusieurs personnes physiques, à la discrétion de l'abonné) de catégories différentes (définies par
l'entité TypeAbonnement, dont les modalités sont décidées par le gestionnaire du vidéoclub.
{\emph e.g.} Promotions, prix préférentiels, durées de locations ou de réservation plus ou moins avantageuses...)

\section{Contraintes fonctionnelles}

  % listing des séquences/scénarios et explications
  % à récupérer sur le wiki
  % choix de conception

%%\subsection{Gestion des films et éditions}

%%% TODO

%%\subsection{Gestion des abonnés et abonnements}

%%% TODO

\subsection{Réservations et locations}

\paragraph{Autour des locations} Un abonné, comme définit ci-dessus, doit pouvoir réserver un film. Pour ce faire, il lui faut un compte, ainsi qu'un solde suffisant. Il faut ensuite que le film existe dans le stock. Le tarif est décidé selon le nombre d'heures désirées (par ex. 6 heures = 6 crédits). Pendant cette période, le gérant doit savoir que le film est loué, et par qui. L'abonné doit aussi pouvoir rendre le film. Une pénalité peut surgir en cas de retard trop important.

\paragraph{Autour des réservations} Un abonné peut réserver un film. Cette étape doit pouvoir se dérouler en 2 phases. La première est de dire "je veux ce film dans 2 semaines". Une table doit donc enregistrer cette phrase et s'en souvenir. 2 semaines plus tard, pour ne pas bloquer l'exemplaire durant l'attente, la réservation doit être effective, donc notée sur un exemplaire et de ce fait le verrouiller.  Un crédit est soustrait à l'utilisateur pour cette action. Ensuite la réservation passe à une simple location lorsque l'abonné vient chercher son film. Ce dernier doit aussi pouvoir annuler une réservation.

\section{Schéma relationnel}

Le Schéma relationnel se trouve en figure~\ref{SR}.

  % figure SR
\begin{figure}[!H]
  \begin{center}
     \includegraphics[width=0.8\textwidth]{Schema_Relationnel.png}
  \end{center}
  \label{SR}
  \caption{Schéma relationnel}
\end{figure}

  % dictionnaire des données VF/EN cette fois-ci (pour faire le lien entre le S-R et le MEA)
\begin{table}
\footnotesize
\begin{tabular}{|l|l|l|l|r|p{5cm}|}
\hline
    Nom MEA             & Nom SR            &  Description                          &  Type     &  Longueur  \\
\hline
\hline
   Film                 & Film              &                                       &           &            \\
    isan                & isan              &  Numéro ISAN                          &  String   & 64         \\
    titre               & title             &  Titre film                           &  String   & 20         \\
    date\_sortie         & release\_date      &  Date de sortie                       &  Date     & 10       \\
    affichable          &                   &  Affichable                           &  Boolean  & 1          \\
\hline
   Personne             & Person            &                                       &           &            \\
    nom\_pers            & last\_name         &  Nom personne                         &  String   & 64       \\
    prénom\_pers         & first\_name        &  Prénom personne                      &  String   & 64       \\
    date\_nais\_pers      & birthdate         &  Date de naissance                    &  Date     & 10       \\
    nationalité         & country           &  Nationalité                          &  String   & 64         \\
\hline
   Edition              & Edition           &                                       &           &            \\
    id\_edit             & id                &  Identificateur                       &  Entier   & 20        \\
    support             & support           &  Support                              &  String   & 64         \\
    date\_edit           & date              &  Date d'édition                       &  Date     & 10        \\
    extras              & extras            &  Autres Infos.                        &  String   & 256        \\
\hline
   Exemplaire           & Copy              &                                       &           &            \\
    id\_exemplaire       & id                &  Identificateur de l'exemplaire       &  Entier   & 20        \\
                        & id\_edition        &                                       &           &           \\
                        & to\_be\_deleted     &                                       &           &          \\
    reservé             & rented            &  Est réservé                          &  booléen  & 1          \\
    loué                & booked            &  Est loué                             &  booléen  & 1          \\
\hline
   Langue               & Language          &                                       &           &            \\
    langue              & language\_name     &  Langue                               &  String   & 64        \\
\hline
   Distinction          & Award             &                                       &           &            \\
    intitule            & name              &  Intitulé                             &  String   & 256        \\
    date\_remise         & year              &  Date de remise                       &  Entier   & 4         \\
\hline
   Genre                & Genre             &                                       &           &            \\
    intitulé\_genre      & name              &  Nom du genre                         &  String   &           \\
\hline
   Relance              & Recovery          &                                       &           &            \\
    num\_relance         & id                &  Numéro relance                       &  Entier   & 20        \\
    niveau              & recovery\_level    &  Niveau de la relance                 &  String   &           \\
   date                 & time              & Heure de la relance                   & HeureDate &            \\
\hline
   Location             & Rent              &                                       &           &            \\
    id\_loc              & id                &  Identificateur                       &  Entier   & 20        \\
                        & id\_subscription   &                                       &           &           \\
                        & id\_copy           &                                       &           &           \\
    date\_loc            & rent\_time         &  Date de location                     & HeureDate & 16       \\
    remise\_prévue       & planned\_delivery  &  Remise prévue                        & HeureDate & 16       \\
    remise\_effective    & actual\_delivery   &  Remise effective                     & HeureDate & 16       \\
\hline
   Réservation          & Booking           &                                       &           &            \\
    id\_res              & id                &  Identificateur                       &  Entier   & 20        \\
    date                & booked\_time       &  Date réservation                     &  HeureDate& 16        \\
    date\_expir          & expiry\_date       &  Date d'expiration                    &  HeureDate& 16       \\
\hline
   Abonnement           & Subscription      &                                       &           &            \\
    id\_abo              & id                &  Identificateur                       &  Entier   & 20        \\
    solde               & balance           &  Solde du compte                      &  Entier   & 20         \\
                        & subscription\_type &                                       &           &           \\
                        & firstname         &                                       &           &            \\
                        & lastname          &                                       &           &            \\
    début               & begin             &  Date début                           &  HeureDate& 16         \\
    butoir              & end               &  Date butoir                          &  HeureDate& 16         \\
\hline
   Abonné               & Subscriber        &                                       &           &            \\
    nom\_ab              & firstname         &  Nom abonné                           &  String   & 64        \\
    prenom\_ab           & lastname          &  Prénom abonné                        &  String   & 64        \\
    teléphone           & phone             &  Numéro de téléphone                  &  String   & 16         \\
    date\_naissance\_ab   & birthdate         &  Date de naissance                    &  Date     & 10       \\
    numéro\_voie         & street\_number     &  N° de voie                           &  String   & 8        \\
    type\_voie           & street\_kind       &  Intitulé de la voie                  &  String   & 16       \\
    libellé\_voie        & street\_name       &  Libellé de la voie                   &  String   & 128      \\
    complement\_adr      & street\_extra      &  Complément d'adresse                 &  String   & 16       \\
    ville               & city              &  Ville                                &  String   & 128        \\
    code\_postal         & postcode          &  Code postal                          &  Entier   & 5         \\
    pays                & country           &  Pays                                 &  String   & 128        \\
    liste\_noire         & blacklisted       &  Client blacklisté ou pas             &  Boolean  & 1         \\
\hline
   Type\_Abo             & SubscriptionType  &                                       &           &           \\
    type                & subscription\_type &  Type d'abonnement                    &  String   & 64        \\
\hline
\end{tabular}
\caption{Dictionnaire des données (traductions Français-Anglais)}
\end{table}

\section{Déploiement et administration}

Explication du choix de processus de développement :\\

\begin{itemize}
	\item Déploiement de windows + SQLServer 2000 dans une VM
	\item Instantiation de la db par un script
	\item Partage de la VM sur tous nos postes pour avoir la même base de travail
\end{itemize}	

\chapter{Implémentation}

\section{Répartition des tâches}
 % expliquer la répartition des tâches entre nous et qui a fait quoi

Pour la répartition des tâches, nous avons procédé en plusieurs étapes, selon les phases d'analyse/conception,
de mise en place de la base et de réalisation des transactions.

\subsection{Analyse/conception}

Pour l'analyse et la conception, au fur et à mesure des entretiens et échanges de documents avec la maîtrise d'ouvrage,
nous avons eu plusieurs réunions en équipe entière de «brainstorming» pour décider de la façon de modéliser les
données et des choix d'implémentations.

C'est au cours de cette phase que Fabrice Troilo a pris le rôle de coordinateur de l'équipe avec la maîtrise d'ouvrage, la réalisation
du premier rapport rendu disponible lors de la deuxieme réunion, ainsi que les premiers schéma qu'y s'y tenaient, permettant au groupe d'avoir une première base solide. Ensuite Bernard Pratz a pris en main la réalisation des documents de conception (Schémas MEA et relationnels), Jonathan Michaux se chargeant
du dictionnaire des données.

Pour la description informelle des transactions, Kevin Dorfer et Menja Tsimba ont commencé le travail avec Jonathan Dorival,
pour ensuite continuer avec Jonathan Michaux et Fabrice Troilo une fois l'analyse finalisée.

\subsection{Mise en place de la base}

Jonathan Dorival a mis en place une machine virtuelle avec Windows XP et y a installé SQL Server 2000, de façon a ce
que toute l'équipe travaille sur les m\^eme outils et Bernard Pratz a écrit le script SQL d'instanciation de la base
(une fois cette dernière validée en réunion avec la maîtrise d'ouvrage).

\subsection{Réalisation des fichiers de transaction}

Nous nous sommes enfin réparti le travail de réalisation des transactions sur la base comme suit :
\begin{itemize}
\item Jonathan Dorival et Bernard Pratz ont fait les transactions portant sur la gestion des films, des éditions et des exemplaires.
\item Jonathan Michaux a réalisé un script de peuplement de la base (permettant de tester les transactions pendant le développement), ainsi que les procédures de relance.
\item Fabrice Troilo a écrit les transactions de location et réservation
\item Kevin Dorfer a réalisé les transactions de gestion des abonnés et abonnements
\end{itemize}

La réalisation des fichiers de transaction est détaillé fichier par fichier dans la section suivante.

\section{Fichiers de transactions}

 % une partie par fichier de transactions, en précisant les détails d'implémentation et les contraintes et difficultés rencontrées.
 % Ensuite faire une partie sur les interactions entre les différentes procédures de transactions

Voici le détail des fichiers de transaction, pour chaque fichier les choix d'implémentation et la description de ce qui
y est réalisé.

\subsection{Script de création de la base {\it creation.sql}}

Réalisé par Bernard Pratz, ce script a été déployé en m\^eme temps que les machines virtuelles servant de base pour l'écriture des transactions.

Pour la mise en place du script de création de la base de données, plusieurs choix d'implémentation ont été fait en fonction
des contraintes du SGBD et du système hôte :

\begin{itemize}
    \item Toutes les chaînes de caractères sont enregistrées dans la base en unicode, par respect des systèmes d'entrées modernes.
    \item Toutes les dates sont des horodates, Transact SQL n'ayant pas de type Date. Pour les dates de naissance, l'heure
        n'étant pas renseignée (et donc mise à zéro).
    \item Les contraintes référentielles (de clef étrangères) sont toutes respectées, toutefois pour les tables de jointures
        avec porteuses, aucune contrainte de clef primaire est définie, chaque tuple de la table étant nécessaire
        unique («Translated\_In» et «Played\_In»).
    \item Pour faciliter les transactions d'effacement, des cascades ont été déclarées sur les clefs étrangères, sauf dans
        certains cas où l'effacement de la référence n'est pas souhaité (comme pour le type d'abonnement qui est défini
        arbitrairement par le gestionnaire).
    \item Les clefs calculées sont des INTEGER. Toutefois, un passage en BIGINT pourrait \^etre nécessaire si le nombre de
        tuples par table devient très important, dépassant le domaine des entiers simple.
    \item La clef ISAN est un BIGINT, le code ISAN étant sur 96bits.
\end{itemize}

\subsection{Script de peuplement de la base {\it peuplement.sql}}

Ce script réalisé par Jonathan Michaux, a permis à toute l'équipe de travailler sur une base contenant déjà des valeurs
afin de pouvoir tester les requ\^etes et les traitements.

\subsection{Transactions de gestion des films ({\it film.sql})}

Fichier de procédures réalisé par Jonathan Dorival et Bernard Pratz

\subsubsection*{Requ\^etes}

\begin{itemize}
\item p\_display\_film: Procédure d'affichage de tous les films avec les données associées.
\item p\_find\_film title complement release\_date genreString awardString personString: non-réalisé % TODO si j'ai le courage...
\end{itemize}

étant donné un film :

\begin{itemize}
\item p\_display\_edition\_by\_film code\_isan : Donne toutes les éditions d'un film
\item p\_display\_film\_by\_isan code\_isan : Donne les informations sur un film
\item p\_display\_crew\_by\_film code\_isan : Donne l'équipe d'un film
\item p\_display\_awards\_by\_film code\_isan : Donne les distinction reçues pour un film
\item p\_display\_genre\_by\_film code\_isan : Donne tous les genres d'un film
\end{itemize}

étant donné une donnée relative à un film :

\begin{itemize}
\item p\_display\_film\_by\_person firstname, lastname : Donne tous les films dans lesquels la personne a participé
\item p\_display\_film\_by\_title title : Donne tous les films par titre
\item p\_display\_film\_by\_genre name : Donne tous les films du genre donné
\item p\_display\_film\_by\_award name, year : Donne tous les films étant donné une distinction et/ou une année
\item p\_display\_film\_between\_dates date1, date2 : Donne tous les films sortis entre les deux dates
\end{itemize}

\subsubsection*{Transactions}

\begin{itemize}
\item p\_new\_film isan, title, complement, release\_date, awards, persons, genres : ajout d'un film.
awards, persons et genres utilisent la méthode des «charindex» qui permet d'itérer sur une
chaîne de caractère formée de façon à insérer plusieurs tuples associé à un film d'un seul coup.
{\emph e.g.} |George,Clooney,6/5/1961,american;Sean,Connery,25/8/1930,scottish|
\end{itemize}

\subsubsection*{Procédures déclenchées}

Il y a trois procédures stockées déclenchées lors d'un delete sur les tables de jointure entourant
la table film :
\begin{itemize}
\item t\_delete\_award\_orphans sur la table award\_film
\item t\_delete\_genre\_orphans sur la table genre\_film
\item t\_delete\_person\_orphans sur la table played\_in
\end{itemize}

Lors d'un «DELETE @one\_id FROM Film;» où @one\_id est un numéro isan de film (ou «*»), une cascade
d'effacement est déclenchée. Toutefois, celle-ci n'est pas propagée au dela des tables de jointures
des relations n-aires. C'est alors que sont appelés ces procédures, qui vérifient si les tuples à
supprimer n'ont pas d'autres liens dans la table de jointure, auquel cas ces tuples sont bien retirés
des tables jointes.

\subsubsection*{Choix d'implémentation}

Nous n'avons pas implémenté la méthode de recherche de film multi-critères pour des raisons de temps
et de rigidité du langage Transact-SQL.

Nous avons préféré utiliser les cascades SQL pour gèrer l'intégrité lors de la suppression des objets
afin de simplifier l'écriture des transactions et de rester proche du SQL pur.

\subsection{Transactions de gestion des éditions ({\it edition.sql})}

Fichier de requ\^etes réalisé par Bernard Pratz

\subsubsection*{Requ\^etes}

\begin{itemize}
\item p\_display\_edition\_by\_film code\_isan : Donne toutes les éditions d'un film (réalisé dans film.sql)
\end{itemize}

\subsubsection*{Transactions}

\begin{itemize}
\item p\_add\_new\_copies\_for\_edition edition number\_of\_copies : ajoute «number\_of\_copies» copies pour une edition
\item p\_add\_new\_edition\_for\_film code\_isan support date extras translations : ajoute une nouvelle édition pour le film «code\_isan», retourne l'identifiant de l'édition ;
translations est, comme présenté dans la section précédente, une chaîne de charindex formattée pour contenir |nom\_langue,type\_traduction|. {\emph e.g.} |français,doublage;anglais,version originale;roumain,sous-titres|
\end{itemize}

\subsubsection*{Procédures déclenchées}

Voici les procédures déclenchées pour les éditions :

\begin{itemize}
\item t\_delete\_language\_orphans
\item t\_delete\_film\_orphans
\item t\_no\_more\_copies\_left
\end{itemize}

selon le m\^eme principe qu'évoqué pour les films, lors d'un effacement de tuple d'édition, on vérifie si
la langue et le film correspondant à l'édition ont d'autres éditions, sinon ils sont eux-aussi supprimés.

Le troisième trigger, t\_no\_more\_copies\_left, sert quant à lui, à mettre le champ «has\_no\_copy» à vrai
sur Film si une édition n'a plus d'exemplaires (pour retirer le film des recherches sans jointures complexes)
et mettre la to\_be\_deleted si un film à supprimer est en cours de réservation ou de location.

\subsection{Transactions de locations et réservations ({\it procedures\_loc\_resa.sql})}

Fichier de requ\^etes réalisé par Fabrice Troilo

\paragraph*{}

Cette section comporte toutes les transactions autour de la location et réservation d'un film par un abonné. Il comporte donc des procédures comme \textit{Effectuer\_location\_proc} qui permet d'effectuer une location sur une édition, ainsi que toutes les actions définies plus tôt dans notre travail, comme rendre un exemplaire, effectuer une réservation et pouvoir l'annuler, ajouter des pénalités pour les retardataires, etc.

\subsubsection*{Choix d'implémentation}

Pour faire les actions décrites ci-dessus, il a fallu utiliser \textit{procédures} et \textit{traitements planifiés}. Il n'a pas été utile d'ajouter des \textit{triggers}.\\

Pour expliquer les choix d'implémentation, nous allons prendre un exemple de procédure puis un exemple de traitement planifié.\\

\subsubsection*{Effectuer\_location\_proc}

La procédure Effectuer\_location\_proc prend en argument l'\textit{id du compte}, l'\textit{id de l'édition} puis une durée, en heures. Plusieurs affichages permettent de suivre le déroulement de la procédure.

Le premier test est celui de la valeur NULL ou chaine vide. Le problème de la chaine vide a été soulevé lors de la soutenance comme un point important manquant. Pour parer à ce problème, la méthode native \textit{nullif} a été utilisé, lors du test avec les chaines de caractères. Le résultat est cohérent, la solution a donc été gardée. 

Pour chaque test, situé dans un \textit{IF}, la procédure retourne directement \textit{-1} \textbf{si la transaction n'est pas encore commencée}. Dans le cas inverse (un test faux dans la transaction) une variable \textit{error} a été mise en place pour permettre en fin de transaction de faire un \textit{COMMIT} ou bien un \textit{ROLLBACK}.\\

Au niveau des actions de la procédure, un premier test est fait qui permet de récupérer un \textit{exemplaire} de l'édition donné. En cas d'échec, la procédure est abandonnée. Ensuite d'autres tests sont fait, dont celui concernant le \textit{solde restant du compte}. Les mêmes causes entrainant les mêmes effets, en cas d'échec du test la procédure est tout de suite annulée (notez que le "prix" d'une location est de 1 crédit par heure).

Ensuite la transaction est lancée à l'aide d'un \textit{BEGIN}. L'exemplaire trouvé est mis à jour pour avoir sa valeur \textit{rented = true}. Les erreurs sont soulevées à l'aide du \textit{@@error} natif du t-sql, et donc la variable \textit{error} est mise à 1 dans le cas d'une faute (comme expliqué ci-dessus). Un tuple est ensuite ajouté dans la table \textit{Rent}, le débit est effectué sur le compte. Enfin, un test est fait sur la variable \textit{error}, et un \textit{COMMIT} ou \textit{ROLLBACK} est fait selon les cas.

\subsubsection*{Job\_attribuer\_exemplaire} 

Pour utiliser les traitements planifiés, comme \textit{job\_attribuer\_exemplaire}, nous avons fait des tests pour les appels de procédures variants entre 30 secondes (lors de la démonstration) et 60 minutes. Sans surprises, les tâches exécutent une procédure (ici \textit{EXEC dbo.Attribuer\_exemplaire\_proc}), qui n'ont pas d'arguments ni de valeurs de retour explicites. 

Dans l'exemple choisi, le principe est d'attribuer un exemple aux réservations qui arrivent dans 1 heures. Pour ce faire, chaque réservation en attente est regardée à l'aide d'un \textit{CURSOR}, et pour chaque résultat, si \textit{la date courante -1 heure précède la date de réservation}, et que celle-ci ne s'est pas déjà vue attribuer un exemplaire, un exemplaire est cherché et affecté à la réservation en cas de succès. L'algorithme utilisé est de type \textit{FIFO} : la réservation la plus ancienne va rechercher en première un exemplaire qui lui correspond (à l'aide d'un simple \textit{ORDER BY}).  

\subsubsection*{Autres} 

Pour une question de clareté, nous n'allons pas détaillé toutes les procédures autant que les deux précédentes. Elles gardent toutes les mêmes choix d'implémentation et varient selon le but final.

\subsection{Procédures de gestion des relances ({\it procedures\_relances.sql})}

Fichier de procédures réalisé par Jonathan Michaux

\paragraph*{}
Le mécanisme de relances sert à suivre les locations des clients de la médiathèque afin de détecter des dépassements dans les durées de location. \\
Une relance est associée à une location lorsque la date de remise prévue de la location est antérieure à la date actuelle. \\
Il existe différents niveaux de relances ; plus le niveau augmente, plus le client est près de se faire blacklister. \\

\subsubsection*{Choix d'implémentation}
La tâche planifiée Create\_Update\_Recovery est chargée de vérifier l'ensemble des locations en cours. Cette procédure parcours l'ensemble des locations qui dépassent leur date de remise prévue. La tâche crée une nouvelle relance et l'associe à toute location tardive. Si une location tardive est déjà associée à une relance, alors le niveau de cette relance est augmenté.

\paragraph*{Procédure déclenchée}
Un trigger nommé Check\_Recoveries est déclenché à chaque mise-à-jour de la table de relances. Il vérifie si la ligne modifiée atteint le niveau maximal de la relance. Si oui, le client correspondant est blacklisté en appelant la procédure blacklisterAbonne.

\subsection{Transactions de gestion des abonnés ({\it requete\_abonne.sql})}
Fichier de procédures réalisé par Kevin Dorfer

%% Kevin Dorfer
\subsubsection*{Requ\^etes}
\begin{itemize}
\item createAbonne: crée un abonné
\item modifNameAbonne: modifie le nom de famille de l'abonne
\item blacklisterAbonne: blacklist un abonné et gère l'impact sur les dépendances   
\item afficherAbonne: afficher la liste des abonnés
\end{itemize}
%\subsubsection*{Transactions}
%\subsubsection*{Choix d'implémentation}

\subsection{Transactions de gestion des abonnements({\it requete\_abonnement.sql})}

%% Kevin Dorfer
\subsubsection*{Requ\^etes}
\begin{itemize}
\item createAbonnement: Ajoute un abonnement
\item modifTypeAbonnement: modifie le propriétaire d'un abonnement
\item prolongerAbonnement: prolonge la date butoire d'un abonnement d'un an
\item afficherLocationAbonnement: affiche toutes les locations liées à un abonnement
\item afficherReservationAbonnement: affiche toutes les réservations liées à un abonnement
\item effacerAbonnement: efface un abonnement
\item afficherAbonnement: affiche toutes les réservations et locations liées à un abonnement
\end{itemize}
%\subsubsection*{Transactions}
%\subsubsection*{Choix d'implémentation}


\chapter*{Conclusion}

 % Reprendre l'intro point a point et montrer qu'on y répondé
Tout au long de notre travail, nous avons réussi à mettre en place une base de donnée dans 
le contexte d'une entreprise de gestion locative de supports vidéos. En se répartissant les 
tâches et à l'aide d'un travail préliminaire de conception réussi et en accord avec notre
encadrant, nous avons réussi a mettre chacun en place nos transactions et regrouper le tout
pour former une base de données que nous pensons efficace et bien conçue, respectant les 
conventions. Nous avons amélioré, suite à la présentation, les procédures de façon à les
rendre plus fiables sur le contrôle des entrées (p.ex. les arguments vides) et réussi un 
jeu de test fonctionnel d'un bout à l'autre des fonctionnalités. Fautes de temps et 
d'un nombre de personne actives trop restreint, nous n'avons pu que survoler le côté 
réparti, qui ne figure donc pas dans le rapport et le livrable.

\appendix

\chapter*{Mode d'emploi}

\footnotesize
\begin{verbatim}

EXECUTION DES SCRIPTS

Après avoir infructueusement tenté de mettre en place un script .bat
d'exécution automatique des fichiers SQL, il est nécessaire d'exécuter
fichier par fichier les sources du projet dans l'analyseur de requetes.

Ainsi, il suffit d'ouvrir dans l'ordre du préfixe des fichiers chaque
fichier pour que le projet soit instancié. Dans le rapport, vous trouverez
les différentes fonctions utilisables pour effectuer d'autres tests.

ORGANISATION DU LIVRABLE:

CD IBDR ACID
    +-+-- Sources/ ....................... sources SQL
    | +----- 00-creation.sql ............. script de création des tables
    | +----- 01-film.sql ................. script de création des procédures et triggers sur les films
    | +----- 02-edition.sql .............. script de création des procédures et triggers sur les éditions
    | +----- 03-requete_abonne.sql ....... script de création des procédures et triggers sur les abonnés
    | +----- 04-requete_abonnement.sql ... script de création des procédures et triggers sur les abonnements
    | +----- 05-procedures_loc_resa.sql .. script de création des procédures et triggers pour les réservations et locations
    | +----- 06-abo.sql .................. script de création des procédures de gestion des abonnés
    | +----- 07-procedures_relances.sql .. script de création des procédures et triggers pour les relances
    | +----- 08-test-edition-film.sql .... script de test du sous-schéma edition/films
    | `----- 09-scenario.sql ............. scénario de test de la base de données
    +-+-- Sources_Contrib ................ sources SQL annexes
    | +----- flush.sql ................... script de remise à zéro de la base
    | +----- peuplement.sql .............. script de peuplement de la base (uniquement à des fins de test)
    | `----- runall.bat .................. tentative de réalisation d'un batch d'exécution des sources
    +-+-- Rapport/
    | +----- Presentation.pdf ............ \
    | +----- Presentation.key ............  > Document de la présentation faite à la soutenance
    | +----- Presentation.ppt ............ /
    | +----- journal_depot_svn.log ....... journal du dépôt SVN à partir duquel nous avons travaillé
    | +----- Rapport_IBDR_ACID.tex ....... source du rapport final
    | +----- Rapport_IBDR_ACID.pdf ....... rapport final
    | +----- Schema_MEA.png .............. Schéma Modèle Entité Association (inclu dans le rapport)
    | `----- Schema_Relationnel.png ...... Schéma Relationnel (inclu dans le rapport)
    +-+-- BD/
      `----- IBDR_ACID_VideoClub ......... Fichier de sauvegarde de la base de données

\end{verbatim}

\chapter*{Sources}

\end{document}
